package output

import (
	"encoding/csv"
	"encoding/json"
	"fmt"
	"os"
	"path/filepath"
	"time"

	"github.com/olekukonko/tablewriter"
)

// OutputDataWithTimestamp 输出通用数据到output目录下的CSV文件，文件名带时间戳
func OutputDataWithTimestamp(filename string, headers []string, rows [][]string, format string) error {
	// 确保output目录存在
	outputDir := "output"
	if err := os.MkdirAll(outputDir, os.ModePerm); err != nil {
		return fmt.Errorf("创建output目录失败: %v", err)
	}

	// 生成带时间戳的文件名
	timestamp := time.Now().Format("2006-01-02_15-04-05")
	timestampedFilename := fmt.Sprintf("%s_%s", filename, timestamp)
	
	switch format {
	case "table":
		table := tablewriter.NewWriter(os.Stdout)
		table.SetHeader(headers)
		table.AppendBulk(rows)
		table.Render()
	case "json":
		var jsonList []map[string]string
		for _, row := range rows {
			entry := make(map[string]string)
			for i := range headers {
				entry[headers[i]] = row[i]
			}
			jsonList = append(jsonList, entry)
		}
		enc := json.NewEncoder(os.Stdout)
		enc.SetIndent("", "  ")
		if err := enc.Encode(jsonList); err != nil {
			return fmt.Errorf("JSON 输出失败: %v", err)
		}
	case "csv":
		// 创建带时间戳的CSV文件
		fullPath := filepath.Join(outputDir, timestampedFilename+".csv")
		file, err := os.Create(fullPath)
		if err != nil {
			return fmt.Errorf("创建CSV文件失败: %v", err)
		}
		defer file.Close()

		writer := csv.NewWriter(file)
		if err := writer.Write(headers); err != nil {
			return fmt.Errorf("写入CSV头部失败: %v", err)
		}
		if err := writer.WriteAll(rows); err != nil {
			return fmt.Errorf("写入CSV数据失败: %v", err)
		}
		writer.Flush()

		if err := writer.Error(); err != nil {
			return fmt.Errorf("CSV写入错误: %v", err)
		}

		fmt.Printf("✅ 数据已保存到 %s\n", fullPath)
	default:
		return fmt.Errorf("不支持的输出格式: %s (请使用 csv/json/table)", format)
	}
	
	return nil
}